package com.cy.pj.goods.dao;
//公司域名(com.cy)+项目名(project-pj)+模块(goods)+层(Dao)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 此对象为一个商品数据层访问对象,现在要求正在此类中定义一个方法,这个方法基于从数据库获取商品信息,
 * 并将其封装到map集合,要求一个行记录map对象(key为表中字段名,值为字段名对应的值),多个map存储到list集合
 *
 * @Repository 此注解同常用于描述数据层实现类对象,本质上就是一个特殊的@Component,
 * 都是要交给spring框架管理的一个Bean对象
 */

@Repository
public class DefaultGoodsDao {
    @Autowired
    private DataSource dataSource;
    //查询商品信息,一个记录映射为内存中的一个map对象
    public List<Map<String,Object>> findGoods() throws SQLException {
        //1,获取连接(从连接池获取)
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        String sql = "select * from tb_goods";
        try {
            conn = dataSource.getConnection();
            //2,创建statement对象
           stmt = conn.createStatement();
            //3,发送sql
            rs = stmt.executeQuery(sql);
            //4,处理结果
            List<Map<String,Object>> list = new ArrayList<>();
            while (rs.next()){//循环一次取一行,一行记录映射为一个map对象
                Map<String,Object> rowMap = new HashMap<>();
                rowMap.put("id",rs.getInt("id"));
                rowMap.put("name",rs.getString("name"));
                rowMap.put("remark",rs.getString("remark"));
                rowMap.put("createdTime",rs.getTimestamp("createdTime"));
                list.add(rowMap);//将存储了一行记录的map对象在存储到list集合
            }
            return list;
        }catch (Exception e){
            e.printStackTrace();
//            throw new RuntimeException(e);//转换为非检查异常(编译时不检测的异常)=运行时异常
        }finally {
            //5,释放资源
            if(rs != null)try {rs.close();}catch (Exception e){e.printStackTrace();}
            if(stmt != null)try {rs.close();}catch (Exception e){e.printStackTrace();}
            //这里的连接是返回到了池中
            if(conn != null)try {rs.close();}catch (Exception e){e.printStackTrace();}
        }

        return null;
    }
}
